package ar.com.cubika.trainees.date;

import java.util.Date;
import java.util.Iterator;

/**
 * Un objeto que representa un rango de fechas.
 * @author clombardi
 */
public class RangoDeFechas {
    private Date desde;
    private Date hasta;
    
    public RangoDeFechas(Date desde, Date hasta) {
        super();
        this.desde = desde;
        this.hasta = hasta;
    }
    
    /**
     * True ssi la fecha parametro esta incluida en el rango.
     */
    public boolean incluye(Date fecha) {
        return 
        (fecha.equals(this.desde) || fecha.after(this.desde)) &&
        (fecha.equals(this.hasta) || fecha.before(this.hasta));
    }
    
    /**
     * La fecha de inicio del periodo
     */
    public Date getFechaInicio() {
    	return this.desde;
    }
    
    /**
     * La fecha de fin del periodo
     */
    public Date getFechaFin() {
    	return this.hasta;
    }
    
    /**
     * Un Iterator que itera sobre las fechas del periodo, en orden.
     * @return
     */
    public Iterator diasIterator() {
    	return new RangoIterator(this);
    }
    
    protected class RangoIterator implements Iterator {
    	private RangoDeFechas rango;
    	private Date fechaActual;
    	
    	
		public RangoIterator(RangoDeFechas rango) {
			this.rango = rango;
			this.fechaActual = rango.getFechaInicio();
		}

		public void remove() {
			throw new UnsupportedOperationException
					("no se puede remover sobre un RangoIterator");
		}

		public boolean hasNext() {
			return this.fechaActual.after(rango.getFechaFin());
		}

		public Object next() {
			Date ahora = this.fechaActual;
			this.fechaActual = DateUtils.addDays(this.fechaActual,1);
			return ahora;
		}
    	
    }
    
}
